﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SQLite;
using System.IO;

namespace lp_csharp_5626
{
    
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /**
         * Neste Metodo é criado a base de dados e a tabela.
         * */
        public void button1_Click(object sender, EventArgs e)
        {
          
                SQLiteConnection conn = new SQLiteConnection("Data Source=db_lp.db");

                conn.Open();

                SQLiteTransaction tran = conn.BeginTransaction();

                SQLiteCommand cmd = conn.CreateCommand();

                cmd.CommandText = "drop table if exists PROF";

                cmd.ExecuteNonQuery();
            
                cmd.CommandText = "create table if not exists PROF(codigo_do_docente integer," +
                            "nome varchar,ultimo_grau varchar, curso varchar," +
                             "categoria varchar, regime_tempo varchar, ano_lectivo integer," +
                              "tipo_estabelecimento varchar, nome_estabelecimento varchar)";

                cmd.ExecuteNonQuery();

                tran.Commit();

                conn.Close();

                MessageBox.Show("Base de dados criada!");
           
        }
        /**
         * Neste Metodo é efetuado leitura dos ficheiros .csv 
         * e inserido na base de dados.!
         * */
        private void button2_Click(object sender, EventArgs e)
        {

            SQLiteConnection conn = new SQLiteConnection("Data Source=db_lp.db");

            conn.Open();

            SQLiteTransaction tran = conn.BeginTransaction();

            SQLiteCommand cmd = conn.CreateCommand();
            
            FileStream fin;
            String s;
            for (int i = 0; i < 11; i++ )
            {
                try
                {
                    fin = new FileStream("reb" + i + ".csv", FileMode.Open);
                }
                catch (FileNotFoundException exc)
                {
                    MessageBox.Show(exc.Message + "Cannot open file.");
                    return;
                }

                StreamReader fstr_in = new StreamReader(fin);

                cmd = conn.CreateCommand();
                cmd.CommandText = "insert into PROF" +
                    " VALUES(?,?,?,?,?,?,?,?,?)";

                for (int x = 0; x < 9; x++)
                {
                    cmd.Parameters.Add(cmd.CreateParameter());
                }

                char[] charArray = new char[] { ',' };

                string[] strArray;
                while ((s = fstr_in.ReadLine()) != null)
                {

                    strArray = s.Split(charArray);

                    try
                    {

                        for (int x = 0; x < 9; x++)
                        {
                            cmd.Parameters[x].Value = strArray[x];
                        }

                        try
                        {
                            cmd.ExecuteNonQuery();

                        }
                        catch (System.Data.SQLite.SQLiteException)
                        {

                        }


                    }
                    catch (System.IndexOutOfRangeException)
                    {

                    }
                   
                    
                }

                if (i == 1)
                {
                    MessageBox.Show("o ficheiro reb" + i + "foi carregado.! \n Aguarde um "+
                        "instante que sejam carregados os restantes \n "+
                        "será informado quando terminar.!");
                }

                if (i == 10)
                {
                    MessageBox.Show(" Todos os Ficheiros foram Carregados.!");
                }

                fstr_in.Close();
                fin.Close();
            }
            
            //fstr_in.Close();
            
            tran.Commit();

            conn.Close();
        }
        /**
         * Metodo efetua estatistica(nº de docentes) 
         * com determinadas carateristicas.(categ, estab, ano)
         * */
        private void statistics_cat_estab_ano_Click(object sender, EventArgs e)
        {
            SQLiteConnection conn = new SQLiteConnection("Data Source=db_lp.db");

            conn.Open();

            SQLiteCommand cmd = conn.CreateCommand();

            cmd.CommandText = "select * from PROF ";
            cmd.ExecuteNonQuery();

            SQLiteDataReader dataBase_read = cmd.ExecuteReader();

            List<doc> listDataBase = new List<doc>();

            while(dataBase_read.Read())
            {
                listDataBase.Add(
                    new doc {  cod_doc= dataBase_read[0].ToString(), categoria = dataBase_read[4].ToString(),
                              nomeEstabeleciemnto = dataBase_read[8].ToString(),
                              ano = dataBase_read[6].ToString() });
            }


            MessageBox.Show(listDataBase[100].nomeEstabeleciemnto);

           var query_cat_estab_ano = from i in listDataBase
                                     where i.categoria == "Assistente de 1º triénio Equiparado" &&
                                     i.nomeEstabeleciemnto == "Escola Superior Politécnica do Exército" &&
                                     i.ano == "2000"
                                     select i.cod_doc.Count();
           int resultado = 0;
            foreach (var value in query_cat_estab_ano)
            {
                resultado += 1;
                Console.WriteLine(value);
            }

            MessageBox.Show(string.Format("o nº total é : {0}", resultado));

            dataBase_read.Close();

            conn.Close();
            

        }

        /**
         * Metodo efetua estatistica(nº de docentes) 
         * com determinadas carateristicas.(grau, estab, ano)
         * */
        private void button4_Click(object sender, EventArgs e)
        {
            SQLiteConnection conn = new SQLiteConnection("Data Source=db_lp.db");

            conn.Open();

            SQLiteCommand cmd = conn.CreateCommand();

            cmd.CommandText = "select * from PROF ";
            cmd.ExecuteNonQuery();

            SQLiteDataReader dataBase_read = cmd.ExecuteReader();

            List<doc> listDataBase = new List<doc>();

            while (dataBase_read.Read())
            {
                listDataBase.Add(
                    new doc
                    {
                        cod_doc = dataBase_read[0].ToString(),
                        grau = dataBase_read[3].ToString(),
                        nomeEstabeleciemnto = dataBase_read[8].ToString(),
                        ano = dataBase_read[6].ToString()
                    });
            }


            MessageBox.Show(listDataBase[100].grau);

            var query_grau_estab_ano = from i in listDataBase
                                      where i.grau == "Formação Musical" &&
                                      i.nomeEstabeleciemnto == "Escola Superior Politécnica do Exército" &&
                                      i.ano == "2000"
                                      select i.cod_doc.Count();
            int resultado = 0;
            foreach (var value in query_grau_estab_ano)
            {
                resultado += 1;
                Console.WriteLine(value);
            }

            MessageBox.Show(string.Format("o nº total é : {0}", resultado));

            dataBase_read.Close();

            conn.Close();
            
        }
        /**
         * Metodo para fechar a aplicação..
         **/
        private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }


    }
}
